package com.dy.yunying.biz.utils;


import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import org.apache.commons.lang3.StringUtils;

import java.nio.charset.StandardCharsets;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class PingYinUtils {
	// 简体中文的编码范围从B0A1（45217）一直到F7FE（63486）
	private static int BEGIN = 45217;
	private static int END = 63486;

	// 按照声 母表示，这个表是在GB2312中的出现的第一个汉字，也就是说“啊”是代表首字母a的第一个汉字。
	// i, u, v都不做声母, 自定规则跟随前面的字母
	private static char[] chartable = {'啊', '芭', '擦', '搭', '蛾', '发', '噶', '哈', '哈', '击', '喀', '垃',
			'妈', '拿', '哦', '啪', '期', '然', '撒', '塌', '塌', '塌', '挖', '昔', '压', '匝',};

	// 二十六个字母区间对应二十七个端点
	// GB2312码汉字区间十进制表示
	private static int[] table = new int[27];

	// 对应首字母区间表
	private static char[] initialtable = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'h', 'j', 'k', 'l', 'm', 'n',
			'o', 'p', 'q', 'r', 's', 't', 't', 't', 'w', 'x', 'y', 'z',};

	// 初始化
	static {
		for (int i = 0; i < 26; i++) {
			// 得到GB2312码的首字母区间端点表，十进制。
			table[i] = gbValue(chartable[i]);
		}
		// 区间表结尾
		table[26] = END;
	}

	// 根据一个包含汉字的字符串返回一个汉字拼音首字母的字符串 最重要的一个方法，思路如下：一个个字符读入、判断、输出
	public static String firstLetter(String sourceStr) {
		String Result = "";
		int StrLength = sourceStr.length();
		int i;
		try {
			for (i = 0; i < StrLength; i++) {
				Result += char2Initial(sourceStr.charAt(i));
			}
		} catch (Exception e) {
			Result = "";
			e.printStackTrace();
		}
		return Result;
	}

	/**
	 * 输入字符,得到他的声母,英文字母返回对应的大写字母,其他非简体汉字返回 '0' 　　*
	 */
	private static char char2Initial(char ch) {
		// 对英文字母的处理：小写字母转换为大写，大写的直接返回
		if (ch >= 'a' && ch <= 'z') {
			return (char) (ch - 'a' + 'A');
		}
		if (ch >= 'A' && ch <= 'Z') {
			return ch;
		}
		// 对非英文字母的处理：转化为首字母，然后判断是否在码表范围内，
		// 若不是，则直接返回。
		// 若是，则在码表内的进行判断。

		// 汉字转换首字母
		int gb = gbValue(ch);
		// 在码表区间之前，直接返回
		if ((gb < BEGIN) || (gb > END)) {
			return ch;
		}
		int i;
		for (i = 0; i < 26; i++) {
			// 判断匹配码表区间，匹配到就break,判断区间形如“[,)”
			if ((gb >= table[i]) && (gb < table[i + 1])) {
				break;
			}
		}
		if (gb == END) {
			// 补上GB2312区间最右端
			i = 25;
		}
		// 在码表区间中，返回首字母
		return initialtable[i];
	}

	/**
	 * 取出汉字的编码 cn 汉字
	 */
	private static int gbValue(char ch) {
		// 将一个汉字（GB2312）转换为十进制表示。
		String str = new String();
		str += ch;
		try {
			byte[] bytes = str.getBytes("GB2312");
			if (bytes.length < 2) {
				return 0;
			}
			return (bytes[0] << 8 & 0xff00) + (bytes[1] & 0xff);
		} catch (Exception e) {
			return 0;
		}
	}

	// 返回中文的首字母
	public static String getPinYinHeadChar(String str) {
		String convert = "";
		for (int j = 0; j < str.length(); j++) {
			char word = str.charAt(j);
			String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(word);
			if (pinyinArray != null) {
				convert += pinyinArray[0].charAt(0);
			} else {
				convert += word;
			}
		}
		return convert;
	}

	public static String getPinYinHeadCharToUppercase (String str) {
		String convert = "";
		for (int j = 0; j < str.length(); j++) {
			char word = str.charAt(j);
			String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(word);
			if (pinyinArray != null) {
				if(isChineseChar(word)){
					convert += StringUtils.upperCase(String.valueOf(pinyinArray[0].charAt(0)));
				}else{
					convert += pinyinArray[0].charAt(0);
				}
			} else {
				convert += word;
			}
		}
		return convert;
	}

	// 第一个字母大写
	public static String getFirstletter(String str) {
		if (StringUtils.isNotEmpty(str)) {
			return getPinYinHeadChar(str).substring(0, 1).toUpperCase();
		}
		return "";
	}

	public static void main(String[] args) {
		System.out.println(getPinYinHeadCharToUppercase("政府的dfdg!@##￥%胜多负少"));
	}

	public static boolean isChineseChar(char c) {
		try {
			return String.valueOf(c).getBytes(StandardCharsets.UTF_8).length > 1;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	// 判断是否是中文 是中文 返回true 不是返回 false
	public static boolean isChinese(String str) {
		String regEx = "[\\u4e00-\\u9fa5]+";
		Pattern p = Pattern.compile(regEx);
		Matcher m = p.matcher(str);
		if (!m.find())
			return true;
		else
			return false;
	}

	// 校验子渠道编码
	public static boolean isChanelCode(String str) {
		String regEx = "^(?!-)(?!_)(?!.*?_$)(?!.*?-$)[a-zA-Z0-9_-]{1,15}+$";
		Pattern p = Pattern.compile(regEx);
		Matcher m = p.matcher(str);
		if (m.find())
			return true;
		else
			return false;
	}

	// 校验返点  /^(\d{1,2}(\.\d{1,3})?|100)$/
	// String regEx = "^(?:[1-9]?\\d|100)$";
	public static boolean isRebatePoint(String str) {
		String regEx = "^(\\d|[1-9]\\d|100)(\\.\\d{1})?$";
		Pattern p = Pattern.compile(regEx);
		Matcher m = p.matcher(str);
		if (m.find())
			return true;
		else
			return false;
	}

	public static String getPingYin(String src) {
		char[] t1 = null;
		t1 = src.toCharArray();
		String[] t2 = new String[t1.length];
		HanyuPinyinOutputFormat t3 = new HanyuPinyinOutputFormat();
		t3.setCaseType(HanyuPinyinCaseType.LOWERCASE);
		t3.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
		t3.setVCharType(HanyuPinyinVCharType.WITH_V);
		String t4 = "";
		int t0 = t1.length;
		try {
			for (int i = 0; i < t0; i++) {
				// 判断是否为汉字字符
				if (Character.toString(t1[i]).matches(
						"[\\u4E00-\\u9FA5]+")) {
					t2 = PinyinHelper.toHanyuPinyinStringArray(t1[i], t3);
					t4 += t2[0];
				} else {
					t4 += Character.toString(t1[i]);
				}
			}
			return t4;
		} catch (Exception e1) {
			e1.printStackTrace();
		}
		return t4;
	}
}  
